﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidad;


namespace Datos.DAO
{
    public class OpcionDAO
    {

        HotelSionEntities bd = new HotelSionEntities();


        public List<T_S_OPCION> listarTreaview()
        {

            List<T_S_OPCION> lista = new List<T_S_OPCION>();
            try
            {
                var q = from c in bd.T_S_OPCION
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
            }
            return lista;

        }

        public List<VW_GRUPO_OPCION> listarGrupoOpcion()
        {

            List<VW_GRUPO_OPCION> lista = new List<VW_GRUPO_OPCION>();
            try
            {
                var q = from c in bd.VW_GRUPO_OPCION
                        select c;
                lista = q.ToList();
            }
            catch
            {

            }
            return lista;

        }


        public List<int> ObtenerOpcionesPorGrupo(int idGrupo)
        {
            List<int> lis = new List<int>();
            List<T_S_OPCION> listaOpcion = new List<T_S_OPCION>();
            try
            {
                var q = from c in bd.T_S_OPCION
                        where c.ID_OPCION == idGrupo
                        select c;

                listaOpcion = q.ToList();

                foreach (T_S_OPCION item in listaOpcion)
                {
                    lis.Add(item.ID_OPCION);
                }

            }
            catch (Exception)
            {
            }
            return lis;
        }

        public List<int> ObtenerOpcionesPorGrupo2(int idGrupo)
        {
            List<int> lis = new List<int>();
            List<VW_GRUPO_OPCION> listaOpcion = new List<VW_GRUPO_OPCION>();
            try
            {
                var q = from c in bd.VW_GRUPO_OPCION
                        where c.ID_GRUPO == idGrupo
                        select c;

                listaOpcion = q.ToList();

                foreach (VW_GRUPO_OPCION item in listaOpcion)
                {
                    lis.Add(item.ID_OPCION);
                }

            }
            catch (Exception)
            {
            }
            return lis;
        }



        public bool Eliminar(T_S_OPCION Obj)
        {
            try
            {
                bd.AttachTo("T_S_OPCION", Obj);
                bd.DeleteObject(Obj);
                bd.SaveChanges();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        public int GrabarOpcion(T_S_OPCION Obj)
        {
            List<int> lis = new List<int>();
            List<T_S_OPCION> listaOpcion = new List<T_S_OPCION>();
            T_S_GRUPO grupoInsert = new T_S_GRUPO();
            int grupoid = 0;
            try
            {
                bd.AddObject("T_S_OPCION", Obj);
                bd.SaveChanges();

                var q = from c in bd.T_S_OPCION
                        where c.ID_OPCION == Obj.ID_OPCION
                        select c;

                listaOpcion = q.ToList();
                grupoid = Convert.ToInt32(listaOpcion[0].ID_OPCION);



            }
            catch (Exception)
            {
            }
            return grupoid;
        }


        public T_S_OPCION ObtenerOpciones(int idOpcion)
        {
            List<T_S_OPCION> lis = new List<T_S_OPCION>();
            try
            {
                var q = from c in bd.T_S_OPCION
                        where c.ID_OPCION == idOpcion
                        select c;

                lis = q.ToList();
                return lis[0];

            }
            catch (Exception)
            {
                return new T_S_OPCION();
            }
        }

        public List<T_S_OPCION> ListarOpciones()
        {
            List<T_S_OPCION> lis = new List<T_S_OPCION>();
            try
            {
                var q = from c in bd.T_S_OPCION
                        orderby c.NRO_ORDEN
                        select c;

                lis = q.ToList();

            }
            catch (Exception)
            {
            }
            return lis;
        }

        public int ObtenerIdOpcion()
        {
            int id_opcion = 0;

            try
            {
                var q = (from c in bd.T_S_OPCION.ToList()
                         select c.ID_OPCION).DefaultIfEmpty(0).Max();

                id_opcion = q;

            }
            catch (Exception)
            {
            }
            return id_opcion + 1;
        }

        public int ObtenerNroElementosPorNodo(int? IdPadre)
        {
            int nodos = 0;
            //string ind_estado = "E";
            try
            {
                var q = (from c in bd.T_S_OPCION.ToList()
                         where c.ID_PADRE == IdPadre 
                         //&& c.IND_ESTADO == "E"
                         select c).DefaultIfEmpty().Count();

                nodos = q;

            }
            catch (Exception)
            {


            }
            return nodos;
        }



        public T_S_OPCION ObtenerOpcion(int idOpcion)
        {
            List<T_S_OPCION> lista = new List<T_S_OPCION>();
            try
            {
                var q = from c in bd.T_S_OPCION
                        where c.ID_OPCION == idOpcion
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
            }
            return lista[0];
        }

        public int Save(T_S_OPCION Obj)
        {
            try
            {
                bd.AddObject("T_S_OPCION", Obj);
                bd.SaveChanges();

                var q = (from p in bd.T_S_OPCION
                         select p.ID_OPCION);

                return q.ToList().Max();

            }
            catch (Exception)
            {
                return 0;
            }
        }

        public bool Modificar(T_S_OPCION obj)
        {
            try
            {
                bd.AttachTo("T_S_OPCION", obj);
                bd.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                bd.SaveChanges();
            }
            catch (Exception)
            {
                return false;

            }
            return true;
        }


        public List<VW_OPCION> ObtenerPorUsuario(string userName, int idPadre)
        {

            List<VW_OPCION> lis = new List<VW_OPCION>();

            try
            {
                var q = from v in bd.VW_OPCION
                        where v.ID_USUARIO == userName
                         && v.ID_PADRE == idPadre
                         && v.IND_ESTADO == "A"
                         orderby v.NRO_ORDEN
                        group new { v } by new
                        {
                            v.ID_OPCION,
                            v.DES_NOMBRE,
                            v.DES_URL,
                            v.ID_PADRE,
                            v.ID_USUARIO,
                            v.IND_TIPO,
                            v.NUM_NIVEL,
                            v.NRO_ORDEN,


                        } into g
                          select g;

                foreach (var s in q)
                {
                    VW_OPCION obj = new VW_OPCION();
                    obj.ID_OPCION = s.Key.ID_OPCION;
                    obj.DES_NOMBRE = s.Key.DES_NOMBRE;
                    obj.DES_URL = s.Key.DES_URL;
                    obj.ID_PADRE = s.Key.ID_PADRE;
                    obj.ID_USUARIO = s.Key.ID_USUARIO;
                    obj.IND_TIPO = s.Key.IND_TIPO;
                    obj.NUM_NIVEL = s.Key.NUM_NIVEL;
                    obj.NRO_ORDEN = s.Key.NRO_ORDEN;
                    lis.Add(obj);
                }


            }
            catch (Exception)
            {
                return null;
            }


            return lis.OrderBy(x => x.NRO_ORDEN).ToList();

        }

        public int GetNroSubNodos(int? idPadre)
        {
            try
            {
                var q = from p in bd.T_S_OPCION
                        where p.ID_PADRE == idPadre
                        where p.IND_ESTADO != "E"
                        select p;

                return q.ToList().Count;

            }
            catch (Exception)
            {
                return 0;
            }
        }
        public bool EliminarOpcionGrupo(int idOpcion)
        {
            try
            {
                bd.ExecuteStoreCommand("DELETE FROM VW_GRUPO_OPCION WHERE ID_OPCION=" + idOpcion);
                return true;
            }
            catch
            {
                return false;
            }

        }

        public bool PA_insertarOpcionGrupo(int ID_GRUPO, int ID_OPCION)
        {
            try
            {
                bd.ExecuteStoreCommand("exec USP_SAVE_GRUPOOPCION " + ID_GRUPO + "," + ID_OPCION);
                return true;
            }
            catch
            {

                return false;
            }
        }




        //public IEnumerable<Object> listaArea() {

        //    IEnumerable<Object> list = new List<Object>();
        //    try
        //    {

        //        var q = from c in bd.T_MAE_TABLA_GENERAL_CAB
        //                from d in bd.T_MAE_TABLA_GENERAL_DET
        //                where c.ID_GENERAL_CAB == d.ID_GENERAL_CAB
        //                && c.NOM_TABLA == "T_MAE_AREA_NEGOCIO"
        //                select new
        //                {   d.ID_GENERAL_DET,
        //                    d.DES_CORTA,
        //                    d.ID_GENERAL_CAB
        //                };

        //        list = q.ToList();
        //    }
        //    catch 
        //    {  
             
        //    }

        //    return list;
        //}




        public List<T_S_OPCION> listaOpcionesW() {


            List<T_S_OPCION> list = new List<T_S_OPCION>();

            try
            {


                var q = from o in bd.T_S_OPCION
                        where o.IND_TIPO == "W"
                        select o;


                list = q.ToList();

            }
            catch{}

            return list;
        }
    }
}
